/* flags bit in 'fbit' header */
#define	substitutionIsOn	0x0001	// KanjiTalk font substitution is on

//	'fbit' standard header
typedef	struct	{
	unsigned short	fontFlags;
	ResType		resourceType;
	short		resourceID;
	unsigned short	fdefVersion;
	unsigned short	fdefID;
	ProcPtr		fdefProc;
	short		fondID;
	unsigned short	priority;
	long		reserved0;
	unsigned short	height;
	unsigned short	width;
	short		style;
	unsigned short	reserved1;
	unsigned short	firstChar;
	unsigned short	lastChar;
} fbitStdHeader;

//	character code to bit image offset
typedef	struct	{
	unsigned short	firstChar;	// first kanji code
	unsigned short	lastChar;	// last kanji code
	unsigned short	flags;		// reserved (This bit must be set to 0)
	unsigned long	offset;		// format 5 :offset to bit image from beginning of 'bdat'
					// format 4 :offset to a offset field to bit image in 'bdat'
} charToOffset;

//	'fbit' for sbit format 4
typedef	struct	{
	fbitStdHeader		header;		//  'fbit' standard header
	unsigned short		flags;		//  flags
	short			sfntID;		// 'sfnt' ID (initialized in OpenFbit call)
	short			fontScript;	// font script code (initialized in OpenFbit call)
	short			bdatFormat;	// 'bdat' format (should be 4)
	unsigned long		bdatOffset;	// offset to 'bdat' in 'sfnt' (initialized in OpenFbit call)
	unsigned long		bdatImageSize;	//Å@size of bit image per a glyph (initialized in OpenFbit call)
	Handle			bdatRowData;	// row bitmap data from 'bdat' (allocated on runtime)
	unsigned char		bdatHeight;	//  height of bit image in bdat
	unsigned char		bdatWidth;	// width of bit image in bdat
	unsigned char		top;		// offset from top of bdat bitmap to fbit bitmap
	unsigned char		left;		// offset from left of bdat bitmap to fbit bitmap
	unsigned long		bdatOffToTree;	//  offset to a offset field to binary tree info from
						// beginning of 'bdat'
	Handle			bdatCompData;	// buffer to compressed data (allocated on runtime)
	Handle			bdatWhiteTree;	// copy of white tree (initialized in OpenFbit call)
	Handle			bdatBlackTree;	// copy of black tree (initialized in OpenFbit call)
	unsigned short		numOfRanges;	//  number of ranges
	charToOffset		ranges[];	//  range information
						// When substitutionIsOn is off, ranges[0] should have offset
						// to the missing glyph. In this case, firstChar should be
						// equal to 0.
//	String			sfntName;	// Pascal string that contains font family name
						// (should be same as unique subfamily identification name
						// in 'name' table)
} sbit4FbitRecord, *sbit4FbitPtr, **sbit4FbitHndl;

//	'fbit' for sbit format 5
typedef	struct	{
	fbitStdHeader		header;		//  'fbit' standard header
	unsigned short		flags;		//  flags
	short			sfntID;		// 'sfnt' ID (initialized in OpenFbit call)
	short			fontScript;	// font script code (initialized in OpenFbit call)
	short			bdatFormat;	// 'bdat' format (should be 5)
	unsigned long		bdatOffset;	// offset to 'bdat' in 'sfnt' (initialized in OpenFbit call)
	unsigned long		bdatImageSize;	// size of bit image per a glyph (initialized in OpenFbit call)
	Handle			bdatRowData;	// row bitmap data from 'bdat' (allocated on runtime)
	unsigned char		bdatHeight;	//  height of bit image in bdat
	unsigned char		bdatWidth;	// width of bit image in bdat
	unsigned char		top;		// offset from top of bdat bitmap to fbit bitmap
	unsigned char		left;		// offset from left of bdat bitmap to fbit bitmap

	unsigned short		numOfRanges;	//  number of ranges
	charToOffset		ranges[];	//  range information
						// When substitutionIsOn is off, ranges[0] should have offset
						// to the missing glyph. In this case, firstChar should be
						// equal to 0.
//	String			sfntName;	//  Pascal string that contains font family name
						// (should be same as unique subfamily identification name
						// in 'name' table)
} sbit5FbitRecord, *sbit5FbitPtr, **sbit5FbitHndl;
spacer image à»â∫Ç…äeÉtÉBÅ[ÉãÉhÇÃà”ñ°Çê‡ñæÇ¢ÇΩǵNjÇ∑ÅB

header
'fbit'ÇÃïWèÄÉwÉbÉ_ÅBfdefIDÇÕ42Ç≈džÇÈDZÇΔÅBfdefVersionÇÕ0x0001Ç≈džÇÈDZÇΔÅBǪÇÃëºÇÃÉtÉBÅ[ÉãÉhÇ…ä÷ǵǃÇÕÅAÅuMacintosh äøéöTalkÉeÉNÉjÉJÉãÉäÉtÉ@ÉåÉìÉXÅvÅiãZèpï]ò_é–ÅjÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

flags
'fbit'ÇÃéÌÅXÇÃê›íËÇé¶ÇµÇ‹Ç∑ÅBÉoÅ[ÉWÉáÉì1Ç≈ÇÕä€äøÉTÉ|Å[ÉgÇ…ÇÊÇÈÉtÉHÉìÉgë„ópÅifont substitutionÅjÇÃÉIÉìÅ^ÉIÉtÇÃÇPÉrÉbÉgÇÃǛǙíËã`Ç≥ÇÍǃǢNjÇ∑ÅBǪÇÃëºÇÃÉrÉbÉgÇÕÇOÇ…Ç≥ÇÍǃǢÇÈDZÇΔÅBÉtÉHÉìÉgë„ópÇ™ÉIÉìÇÃèÍçáÇ…ÇÕÅA'fbit'Ç≈íËã`Ç≥ÇÍǃǢǻǢäøéöÉRÅ[ÉhÇï\é¶Ç∑ÇÈç€Ç…ä€äøÉTÉ|Å[ÉgÇÃìΔé©ÇÃÉtÉHÉìÉgÉTÅ[É`ÉvÉçÉZÉXÇ…ÇÊÇÈÉtÉHÉìÉgÇÃë„ópÇ™ãNDZÇËÇ‹Ç∑ÅBÉIÉtÇÃèÍçáÇ…ÇÕ'fbit'Ç™ÉfÅ[É^ÇéùÇΩǻǢäøéöÉRÅ[ÉhÇ…ëŒÇµÇƒÅusbitÅvÇ™éùǬfbitópÇÃÉ~ÉbÉVÉìÉOÉLÉÉÉâÉNÉ^Çï\é¶ÇµÅAä€äøÉTÉ|Å[ÉgÇ…ÇÕÉGÉâÅ[Çï‘Ç≥ǻǢÇÃÇ≈ÉtÉHÉìÉgÇÃë„ópÇ™ãNDZÇËÇ‹ÇπÇÒÅB


ê}2


sfntID
ëŒè€'sbit'Çä‹Çfi'sfnt'ÉäÉ\Å[ÉXÇÃIDÅBsbit fdefÇ™èâä˙âªÇµÇ‹Ç∑ÅB

fontScript
ÉtÉHÉìÉgÇÃÉXÉNÉäÉvÉgÉRÅ[ÉhÅBsbit fdefÇ™èâä˙âªÇµÇ‹Ç∑ÅB

bdatFormat
ëŒè€'sbit'ÇÃ'bdat'ÇÃÉtÉHÅ[É}ÉbÉgÅBDZÇÃsbit fdefÇ≈ÇÕÉtÉHÅ[É}ÉbÉgÇÃ4ÇΔ5ÇÃÇ›ÇÉTÉ|Å[ÉgǵNjÇ∑ÅB

bdatOffset
'sfnt'ÉäÉ\Å[ÉXì‡ÇÃ'bdat'ÉeÅ[ÉuÉãÇÃÉçÉPÅ[ÉVÉáÉìÅBsbit fdefÇ™èâä˙âªÇµÇ‹Ç∑ÅB

bdatImageSize
'bdat'ì‡ÇÃï∂éöÉfÅ[É^ÇÃàÍï∂éöï™ÇÃÉoÉCÉgÉTÉCÉYÅBsbit fdefÇ™èâä˙âªÇµÇ‹Ç∑ÅB

bdatRowData
'bdat'ÉfÅ[É^ÇÃì«Ç›èoǵêÊÇÃÉoÉbÉtÉ@ÅBsbit fdefÇ™ämï€Å^âï˙ǵNjÇ∑ÅB

bdatHeight
'bdat'ì‡ÇÃï∂éöÇÃçÇÇ≥ÅBÉsÉNÉZÉãíPà ÅB'sbit'ÇÃindexSubTable2ÇÃbigMetrics.heightÇΔìØÇ∂ílÇ≈džÇÈDZÇΔÅB

bdatWidth
'bdat'ì‡ÇÃï∂éöÇÃïùÅBÉsÉNÉZÉãíPà ÅB'sbit'ÇÃindexSubTable2ÇÃbigMetrics.widthÇΔìØÇ∂ílÇ≈džÇÈDZÇΔÅB

top / left
'bdat'ÉrÉbÉgÉ}ÉbÉvÇ©ÇÁ'fbit'ÉrÉbÉgÉ}ÉbÉvÇ÷ÇÃÉIÉtÉZÉbÉgÅB'bdat'ÇÃÉrÉbÉgÉ}ÉbÉvÇÃbound rectangleÇΔ'fbit'ÇÃÉrÉbÉgÉ}ÉbÉvÇÃbound rectangleÇÃç∂è„ÇÃà íuǙǫÇÃÇ≠ÇÁÇ¢Ç∏ÇÍǃǢÇÈÇ©Çé¶ÇµÇ‹Ç∑ÅBÇΩÇæÇµÅAí èÌÇÕÅAtopÅAleftóºï˚ÇΔLJ0Ç…Ç»ÇÈÇÕÇ∏Ç≈Ç∑ÅBâ∫ê}éQèΔÅB

'bdat'ÇΔ'fbit'ÇÃÉrÉbÉgÉ}ÉbÉvÇÃä÷åWê}


bdatOffToTreeÅisbit formatÇ™ÇSÇÃèÍçáÇÃÇ›ë∂ç›Ç∑ÇÈÅj
'bdat'ì‡ÇÃformat=4ópÇÃÉoÉCÉiÉäÉcÉäÅ[Ç÷ÇÃÉIÉtÉZÉbÉgÇäiî[Ç∑ÇÈÉtÉBÅ[ÉãÉhÇ÷ÇÃÉIÉtÉZÉbÉgÅB
bdatCompDataÅisbit formatÇ™ÇSÇÃèÍçáÇÃÇ›ë∂ç›Ç∑ÇÈÅj
à≥èkÇ≥ÇÍÇΩÉfÅ[É^Çì«Ç›çûÇfiÉoÉbÉtÉ@ÅBsbit fdefÇ™ämï€Å^âï˙ǵNjÇ∑ÅB

bdatWhiteTreeÅisbit formatÇ™ÇSÇÃèÍçáÇÃÇ›ë∂ç›Ç∑ÇÈÅj
îíÇÃÉsÉNÉZÉãÇÃÉoÉCÉiÉäÉcÉäÅ[ÇÃÉRÉsÅ[ÅBsbit fdefÇ™ämï€Å^âï˙ǵNjÇ∑ÅB

bdatBlackTreeÅisbit formatÇ™ÇSÇÃèÍçáÇÃÇ›ë∂ç›Ç∑ÇÈÅj
çïÇÃÉsÉNÉZÉãÇÃÉoÉCÉiÉäÉcÉäÅ[ÇÃÉRÉsÅ[ÅBsbit fdefÇ™ämï€Å^âï˙ǵNjÇ∑ÅB

numOfRanges / ranges[ ]
ÉâÉìÉeÅ[ÉuÉãÇΔǪÇÃêîÅBÉâÉìÉeÅ[ÉuÉãÇÕäøéöÉLÉÉÉâÉNÉ^Å[ÉRÅ[ÉhÅiÉVÉtÉgJISÅjÇΔ'bdat'ì‡ÇÃÉrÉbÉgÉ}ÉbÉvÉfÅ[É^ÇÃÉçÉPÅ[ÉVÉáÉìÇΔÇÃëŒâûÇé¶ÇµÇ‹Ç∑ÅBÉçÉPÅ[ÉVÉáÉìÇÕ'bdat'ÉeÅ[ÉuÉãÇÃêÊì™Ç©ÇÁÇÃÉIÉtÉZÉbÉgÇ≈éwíËǵNjÇ∑ÅB
ÉLÉÉÉâÉNÉ^Å[ÉRÅ[ÉhÇÕÇPÇ©ÇÁÇÃòAë±ÇµÇΩÉCÉìÉfÉbÉNÉXî‘çÜÇ…ïœä∑Ç≥ÇÍǃégópÇ≥ÇÍÇÈÇÃÇ≈ÅAé¿ç€Ç…ÇÕäøéöÇÃäÑÇËìñǃÇÁÇÍǃǢǻǢÉRÅ[ÉhÇä‹ÇÒÇ≈ǢǃLJç\ǢNjÇπÇÒÅB'bdat'ÇÕÉLÉÉÉâÉNÉ^Å[ÉRÅ[ÉhèáÇ…ÅAÇΩÇæÇµòAë±ÇµÇƒÉrÉbÉgÉ}ÉbÉvÉfÅ[É^Çé˚ÇflǃǢÇÈDZÇΔÅBÇΩÇΔǶnjÅAäøéöè„à ÉoÉCÉgÇÃ$A0Ç©ÇÁ$DFÇ‚â∫à ÉoÉCÉgÇÃ$7FÇÕfirstCharÇΔlastCharÇÃä‘Ç…ä‹Ç‹ÇÍǃǢǃLJñ≥éãÇ≥ÇÍÇ‹Ç∑ÅBãtÇ…ÅAè„à ÉoÉCÉg$88ÇÃÉâÉCÉìÇÇ∑Ç◊ǃä‹ÇfiÉâÉìÇíËã`ǵÇΩÇΔÇ´Ç…$887FÇ…ëŒâûÇ∑ÇÈÉrÉbÉgÉ}ÉbÉvÉfÅ[É^Ç™'bdat'ì‡Ç…ë∂ç›ÇµÇƒÇÕÇ»ÇÁǻǢÅBÉRÅ[ÉhÇ™íËã`Ç≥ÇÍǃǢÇÈDžLJǩǩÇÌÇÁÇ∏åªç›ÇÕégÇÌÇÍǃǢǻǢîÕàÕÅiãLçÜãÊÇ‚ëÊàÍêÖèÄÇΔëÊìÒêÖèÄÇÃÇ†Ç¢ÇæÇ»Ç«ÅjÇÕÉâÉìÉeÅ[ÉuÉãÇ…ÇÊǡǃÉXÉLÉbÉvÇ≥ÇÍǃǢÇÈÇ◊Ç´Ç≈Ç∑ÅB'fbit'ÇÃflagsÇ≈ÉtÉHÉìÉgë„ópÇÃÉrÉbÉgÇ™ÉIÉtÇÃèÍçáÅArangesÇÃç≈èâÇÃÉGÉìÉgÉäÅiranges[0]ÅjÇÃoffsetÇÕfbitópÇÃÉ~ÉbÉVÉìÉOÉLÉÉÉâÉNÉ^ÇÃÉrÉbÉgÉ}ÉbÉvÉfÅ[É^ÇéwÇµÇƒÇ¢Ç»ÇØÇÍnjǻÇÁǻǢÅBDZÇÃÇΔÇ´firstCharÅAlastCharÇÕÇΔLJDžÇOÇ≈džÇÈDZÇΔÅBcharToOffsetì‡ÇÃflagsÇÕÅAåªç›ñ¢íËã`ÅBïKÇ∏0Ç…ÉZÉbÉgǵǃÇ≠ÇæÇ≥Ç¢ÅB

sfntName
ÉpÉXÉJÉãÉXÉgÉäÉìÉOÉtÉHÅ[É}ÉbÉgÇÃÉtÉHÉìÉgñºÅBDZDZÇ≈ÇÃñºëOÇÕ'FOND'ÇÃñºëOÇ≈ÇÕÇ»Ç≠ÅA'sfnt'ÇÃ'name'ÉeÅ[ÉuÉãÇÃUnique Subfamily Identification Name (Name ID=3)ÇΔìØÇ∂LJÇÃÇéwíËǵNjÇ∑ÅBÇ‹ÇΩÅAégÇÌÇÍÇÈUnique Subfamily NameÇÕPlatform-specific ID (script code)Ç™'fbit'ÇÃfontScriptÇΔìØÇ∂Ç≈džÇÈName recordÇ©ÇÁÇÃLJÇÃÇ≈džÇÈDZÇΔÅB

'bdat' ÇΔ sbit fdef ÇÃÉfÅ[É^ÇÃä÷òAÇ…ä÷Ç∑ÇÈê}ï\


TechNote - fbit42ÉtÉHÉìÉgÉtÉHÅ[É}ÉbÉgÇ÷ñflÇÈ
ˇ